package com.hitqz.robot.netty.decoder;

import com.hitqz.robot.api.dispatch.model.MessageDto;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 机器人控制信息的解码器
 * @author xupkun
 * @date 2023/8/4
 */
@Slf4j
public class Robot2ServerDecoder extends ByteToMessageDecoder {


    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        try {
            while (true) {
                byteBuf.markReaderIndex();
                byte firstByte = byteBuf.readByte();
                byte secondByte = byteBuf.readByte();
                if ((firstByte & 0xFF) == 0xEB && (secondByte & 0xFF) == 0x90) {
                    break;
                }
                byteBuf.resetReaderIndex();
                byteBuf.readByte();
                if (byteBuf.readableBytes() < 4) {
                    return;
                }
            }
            short version = byteBuf.readShort();
            byte[] clientIdData = new byte[32];
            byteBuf.readBytes(clientIdData);
            String clientId = new String(clientIdData).trim();
            int sn = byteBuf.readIntLE();
            short cmd = byteBuf.readShortLE();
            int dataLength = byteBuf.readIntLE();
            byte[] data = new byte[dataLength];
            if (dataLength > Integer.MAX_VALUE) {
                log.info("数据量重制");
                //byteBuf.readBytes(byteBuf.rea
                byteBuf.markReaderIndex();
                return;
            }
            if (dataLength > byteBuf.readableBytes()) {
                byteBuf.resetReaderIndex();
                log.info("数据回滚{}---{}", dataLength, byteBuf.readableBytes());
                return ;
            }
            byteBuf.readBytes(data);
            MessageDto msg = new MessageDto();
            msg.setClientId(clientId);
            msg.setCmd(cmd);
            msg.setDataLength(dataLength);
            msg.setData(data);
            msg.setHeader(new byte[]{
                    (byte) 0xEB, (byte) 0x90
            });
            msg.setSn(sn);
            list.add(msg);
        }catch (Exception e) {
            //byteBuf.readBytes(byteBuf.readableBytes());
            byteBuf.resetReaderIndex();
            log.info("Failed to read" + e.getMessage());
        }
    }
}



